package com.eelye.util.backlog;

import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.alibaba.fastjson.JSON;
import org.slf4j.helpers.MessageFormatter;

/**
 * logback参数（占位符）转成json输出的转换器
 * 使用：在logback.xml里加入<conversionRule conversionWord="m" converterClass="com.eelye.test.ArgumentJsonFormatLayout"/>
 */
public class ArgumentJsonConversion extends MessageConverter {

    @Override
    public String convert(ILoggingEvent event) {
        try {
            Object[] argumentArr = event.getArgumentArray();
            String[] arr = new String[argumentArr.length];

            //循环各个参数，判断类型
            for (int i = 0; i < argumentArr.length; ++i) {
                Object obj = argumentArr[i];
                String str;

                // 因为数组、Map、对象里都可能嵌套对象，所以要想都输出json，必须从根开始都toJson。
                if (obj instanceof String) {
                    str = obj.toString();
                } else {
                    str = JSON.toJSONString(obj);
                }
                arr[i] = str;
            }

            return MessageFormatter.arrayFormat(event.getMessage(), arr).getMessage();
        } catch (Exception e) {
            return event.getMessage();
        }
    }
}
